// class 描述一类具体事物的抽象特征，用来描述一类具体对象的抽象成员

// ES6以前，函数 + 原型 模拟实现类，ES6添加了class

export {}

class Person {
  // 类中声明属性，不能在constructor动态添加
  // 公有成员，默认public
  public name: string
  // 类的属性必须要有一个初始值，可在这等号赋值，或在构造函数上赋值
  // 私有属性
  private age: number
  // protected 只允许在子类中访问该成员
  protected gender: boolean

  constructor(name: string, age: number) {
    this.name = name
    this.age = age
    this.gender = true
  }

  sayHi(msg: string): void {
    console.log(msg)
  }
}

class Student extends Person {
  constructor(name: string, age: number) {
    super(name, age)
    console.log(this.gender)
  }
}
class Student1 extends Person {
  // private不能在外边被实例化的，protected也是，但是可以被继承
  private constructor(name: string, age: number) {
    super(name, age)
    console.log(this.gender)
  }
  static create(name: string, age: number) {
    return new Student1(name, age)
  }
}

// 类的成员访问修饰符
const tom = new Person('tom', 18)
console.log(tom.name)
// console.log(tom.age) // 访问不了
// console.log(tom.gender) // 访问不了

const jack = new Student('rv', 18)
const jack1 = Student1.create('rv', 18)